题目:
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:
可以向下、或者向右。同时在棋盘上C点有一个对方的马,
该马所在的点和所有跳跃一步可达的点称为对方马的控制点。
因此称之为"马拦过河卒"。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过16的整数),
同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,
假设马的位置是固定不动的,并不是卒走一步马走一步。
思路:
本题很自然就可以想到采用回溯法求解。回溯法在求解网格类算法问题是有效的。具体求解时,先根据马的位置标记卒子不能到达的位置(马行日),在当前位置下,如果向右可以移动,则递归向右移动,如果向下可以移动,则递归向下移动,如果到达目标,则终止递归。需要注意的是,利用递归来表达回溯法是很自然的。因为回溯法是深度优先的,递归也是。
程序源代码如下:
#include "stdlib.h"
#include "stdio.h"
static int path[30] = {0};/*记录路径,值为1表示向右,值为2表示向下16*2-2=30*/
int pathNum = 0;/*记录路径长度*/
static int mesh[16][16] = {0};/*16*16棋盘*/
int Bx,By,Cx,Cy;/*记录B,C的位置,A的位置为(0,0)*/
/*设置马的控制位置*/
void SetConfig ()
{